package com.nuanshui.heatedloan.task.proxy;

import java.lang.reflect.Method;
import java.util.HashMap;

/**
 * 一个class 解析后数据承载类
 * @param 
 * @author guohao
 * @date 2017年2月13日 上午9:51:40
 * @since $
 */
public class MetaClass {
	
	public Class targetClass;//class 类型
	
	public Method targetMethod;//要执行的方法
	
	public HashMap<String,Method>  setMethods = new HashMap<String,Method>();//存放set方法
	
	

	public MetaClass() {
		super();
	}

	public MetaClass(Class targetClass, Method targetMethod) {
		super();
		this.targetClass = targetClass;
		this.targetMethod = targetMethod;
		parseClass(targetClass);
		
	}
	
	

	public Class getTargetClass() {
		return targetClass;
	}

	public void setTargetClass(Class targetClass) {
		this.targetClass = targetClass;
	}

	public Method getTargetMethod() {
		return targetMethod;
	}

	public void setTargetMethod(Method targetMethod) {
		this.targetMethod = targetMethod;
	}
	
	
	/**
	 * 获取targetClass类的实例
	 * @param @return
	 * @author guohao
	 * @date 2017年2月13日 上午9:52:51
	 * @since $
	 */
	public Object getInstance() {
		try {
			if(this.targetClass!=null) {
				return targetClass.newInstance();
			}
		} catch (InstantiationException e) {
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	
	
	private void parseClass(Class clazz) {
		Method methods[] = clazz.getMethods();
		
		for(Method method :methods) {
			addSetMethods(method);
			
		}
	}
	
	/**
	 * 获取set方法
	 * @param @param name
	 * @param @return
	 * @author guohao
	 * @date 2017年2月13日 上午9:52:37
	 * @since $
	 */
	public Method getSetMethod(String name) {
		return this.setMethods.get(name);
	}
	
	/**
	 * 增加set方法
	 * @param @param method
	 * @author guohao
	 * @date 2017年2月13日 上午9:52:14
	 * @since $
	 */
	private void addSetMethods(Method method) {
		 String name = method.getName();
	     if (name.startsWith("set") && name.length() > 3) {
	        if (method.getParameterTypes().length == 1) {
	            name = PropertyNamer.methodToProperty(name);
	            this.setMethods.put(name, method);
	        }
	     }
	}
}
